#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 用于路径记录
int *path;
int pathTop = 0;

// 用于标记哪些数字已使用
int *used;

// 存储所有排列字符串
char **result;
int resultTop = 0;

// 计算 n! 以分配足够的 result 空间
int factorial(int n) {
    int res = 1;
    for (int i = 2; i <= n; ++i)
        res *= i;
    return res;
}

// 回溯生成排列
void backtracking(int n) {
    if (pathTop == n) {
        // 分配字符串空间，最大长度为 n * 3，考虑每个数字最多占3位
        char *perm = (char *)malloc(n * 3);
        perm[0] = '\0';

        char buf[12];
        for (int i = 0; i < n; i++) {
            snprintf(buf, sizeof(buf), "%d", path[i]);
            strcat(perm, buf);
        }

        result[resultTop++] = perm;
        return;
    }

    for (int i = 1; i <= n; i++) {
        if (used[i]) continue;

        path[pathTop++] = i;
        used[i] = 1;

        backtracking(n);

        pathTop--;
        used[i] = 0;
    }
}

// 字典序排序比较函数
int compareStrings(const void* a, const void* b) {
    return strcmp(*(const char**)a, *(const char**)b);
}

int main() {
    int n, k;
    scanf("%d %d", &n, &k);

    if (n == 1) {
        printf("1\n");
        return 0;
    }

    // 初始化变量
    path = (int *)malloc(sizeof(int) * n);
    used = (int *)calloc(n + 1, sizeof(int)); // 从1开始，用n+1大小
    int total = factorial(n);
    result = (char **)malloc(sizeof(char*) * total);

    // 回溯生成所有排列
    backtracking(n);


    // 输出第 k 个排列（下标从0开始）
    printf("%s\n", result[k - 1]);

    // 清理内存
    for (int i = 0; i < resultTop; i++) {
        free(result[i]);
    }
    free(result);
    free(path);
    free(used);

    return 0;
}
